#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

class PublisherNode : public rclcpp::Node
{
public:
    PublisherNode(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "loop to get parameter value");
        get_str_ = this->declare_parameter<std::string>("get_str", "");
    }
    void handle()
    {
        while (true)
        {
            this->get_parameter("get_str", get_str_);
            // 不加这个判断很大概率下都是还没有读取这个参数的值，参数就已经被设置为空了
            if (get_str_.empty())
            {
                continue;
            }
            if (get_str_ == "s")
            {
                RCLCPP_INFO(this->get_logger(), "get string is(s)==%s", get_str_.c_str());
            }
            else if (get_str_ == "e")
            {
                RCLCPP_INFO(this->get_logger(), "get string is(e)==%s", get_str_.c_str());
            }
            this->set_parameter(rclcpp::Parameter("get_str", ""));
        }
    }

    void start()
    {
        // 当有持续的工作需要进行时，需要开启新的线程，防止主线程无法即使响应其他请求
        std::thread{std::bind(&PublisherNode::handle, this)}.detach();
    }
    // void start()
    // {
    //     while (true)
    //     {
    //         this->get_parameter("get_str", get_str_);
    //         if (get_str_ == "s")
    //         {
    //             RCLCPP_INFO(this->get_logger(), "get string is(s)==%s", get_str_.c_str());
    //         }
    //         get_str_.c_str();
    //     }
    // }

private:
    std::string get_str_{};
};

int main(int argc, char **argv)
{
    // 初始化ros2的C++接口
    rclcpp::init(argc, argv);
    // 建立节点对象
    auto node = std::make_shared<PublisherNode>("loop_get_param_node");
    node->start();
    // 运行节点，检测退出信号
    rclcpp::spin(node);
    // 销毁节点并关闭C++接口
    rclcpp::shutdown();

    return 0;
}